// using Game.Core;
// using SimpleExample.Test;
// using Unity.Entities;
// using Unity.Jobs;
// using Unity.Mathematics;
// using Unity.Rendering;
// using Unity.Transforms;
// using UnityEngine;
// using UnityEngine.UI;
// using Random = UnityEngine.Random;
//
// namespace Demo.ECSExample
// {
//     public partial class ExampleSystem : SystemBase
//     {
//         private Mesh m_Mesh;
//         private Material m_Material;
//
//         private EntityManager m_EntityManager;
//         private EntityArchetype m_EntityArchetype;
//
//         private Entity[] m_Entities;
//
//         public Slider Slider;
//
//         protected override void OnCreate()
//         {
//             AssetHolder assetHolder = Resources.Load<GameObject>("Demo/AssetHolder").GetComponent<AssetHolder>();
//             m_Mesh = assetHolder.mesh;
//             m_Material = assetHolder.material;
//             
//             m_EntityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
//             
//             m_EntityArchetype = m_EntityManager.CreateArchetype(
//                 ComponentType.ReadWrite<LocalToWorld>(),
//                 ComponentType.ReadWrite<RenderMesh>(),
//                 ComponentType.ReadWrite<RenderBounds>(),
//                 ComponentType.ReadOnly<Translation>(),
//                 ComponentType.ReadOnly<Rotation>(),
//                 ComponentType.ReadWrite<Game.UI.HUD>(),
//                 ComponentType.ReadOnly<ExampleData>()
//             );
//         }
//
//         public void CreateAllEntity(int maxcount, float randomNum)
//         {
//             m_Entities = new Entity[maxcount];
//             for (int i = 0; i < maxcount; i++)
//             {
//                 float x = Random.value * randomNum * 2 - randomNum;
//                 float y = Random.value * randomNum * 2 - randomNum;
//                 float z = Random.value * randomNum * 2 - randomNum;
//                 m_Entities[i] = CreateEntity(x, y, z);
//             }
//         }
//
//         private Entity CreateEntity(float x, float y, float z)
//         {
//             Entity entity = m_EntityManager.CreateEntity(m_EntityArchetype);
//             m_EntityManager.SetComponentData(entity, new LocalToWorld()
//             {
//                 Value = new float4x4(quaternion.identity, new float3(0, 0, 0))
//             });
//             m_EntityManager.SetSharedComponentManaged(entity, new RenderMesh()
//             {
//                 mesh = m_Mesh,
//                 material = m_Material,
//                 layerMask = 0xfffffff
//             });
//             m_EntityManager.SetComponentData(entity, new RenderBounds()
//             {
//                 Value = new AABB()
//                 {
//                     Center = new float3(0, 0, 0),
//                     Extents = new float3(0.5f, 0.5f, 0.5f)
//                 }
//             });
//             m_EntityManager.SetComponentData(entity, new Translation()
//             {
//                 Value = new float3(x, y, z)
//             });
//             m_EntityManager.SetComponentData(entity, new Rotation()
//             {
//                 Value = quaternion.identity
//             });
//             // float moveDistance = Random.Range(0.5f, 1f) * 5;
//             m_EntityManager.SetComponentData(entity, new ExampleData()
//             {
//                 rotateSpeed = new float3(Random.value * math.PI * 2, Random.value * math.PI * 2,
//                     Random.value * math.PI * 2),
//                 moveSpeed = new float3(Random.Range(0.5f, 1f), Random.Range(0.5f, 1f), Random.Range(0.5f, 1f)),
//                 // moveDistance = moveDistance,
//                 // origin = new float3(x, y, z),
//                 // distanceSqr = moveDistance * moveDistance
//             });
//             m_EntityManager.SetComponentData(entity, new Game.UI.HUD()
//             {
//                 Slider = Slider
//             });
//             return entity;
//         }
//
//         protected override void OnUpdate()
//         {
//             float deltaTime = Time.DeltaTime;
//             float elapsedTime = (float)Time.ElapsedTime;
//
//             // var dispatcher = EventScheduler<PropertyChangedEvent>.CreateEventDispatcher();
//             Entities.ForEach((int entityInQueryIndex, ref ExampleData exampleData, ref Translation translation, ref Rotation rotation) =>
//             {
//                 rotation.Value = math.mul(math.normalize(rotation.Value),
//                     quaternion.AxisAngle(exampleData.rotateSpeed, deltaTime));
//
//                 translation.Value += new float3(exampleData.moveSpeed.x * deltaTime,
//                     exampleData.moveSpeed.y * deltaTime,
//                     exampleData.moveSpeed.z * deltaTime);
//                 
//                 // dispatcher.Dispatch(entityInQueryIndex, new PropertyChangedEvent()
//                 // {
//                 //     changed = elapsedTime
//                 // });
//             }).ScheduleParallel();
//             
//             // EventScheduler.Dispatch(Dependency);
//             
//             // Entities.ForEach((Game.UI.HUD hud) =>
//             // {
//             //     hud.Slider.value = (float)(Time.ElapsedTime % 60);
//             // }).WithoutBurst().Run();
//         }
//
//         protected override void OnDestroy()
//         {
//             base.OnDestroy();
//             if (null == m_Entities) return;
//             for (int i = 0; i < m_Entities.Length; i++)
//             {
//                 m_EntityManager.DestroyEntity(m_Entities[i]);
//             }
//         }
//     }
// }